<template>
	<view>
		<view class="content">
			<view class="title">请输入金额：</view>
			<view class="input-bg">
				<image style="width: 30rpx;height: 30rpx;margin-right: 4rpx;" src="/static/RMB.png"></image>
				<input v-model="amount" type="digit" placeholder="例如:12345.67" @input="formatInput" />
			</view>
			<view style="color: #666;font-size: 13px;">支持整数和小数，最多保留两位小数</view>
		</view>

		<button class="submit" @click="convert">转换大写</button>

		<view class="content">
			<view class="title">大写金额：</view>
			<view class="result">{{result}}</view>
		</view>

		<view style="padding:50rpx 20rpx;">
			<view style="color: #333;font-size: 15px;">转换说明</view>
			<view style="color: #666;font-size: 12px;white-space:break-spaces;line-height: 40rpx;margin-top: 10rpx;">
				遵循国家标准：\n1.连续多个 “0”，只写一个 “零”。\n2.角位是 “0”，分位不是 “0”，元后必须写 “零”。\n3.‌只有当金额没有角和分时（角、分均为 0），才在末尾加 “整”。
			</view>
		</view>
	</view>
</template>

<script setup>
	import {
		ref,
		computed,
		watch
	} from 'vue';
	import {
		onLoad,
		onShow,
		onReady
	} from '@dcloudio/uni-app'
	// 金额输入值
	const amount = ref('');
	// 转换结果
	const result = ref('');

	// 修改点2：添加输入格式化函数，控制最多两位小数
	const formatInput = (e) => {
		// console.log('formatInput', e)
		// 获取输入值
		let value = e.detail.value;

		// 移除所有非数字和非小数点的字符
		value = value.replace(/[^\d.]/g, '');

		// 确保只有一个小数点
		value = value.replace(/\.{2,}/g, '.');

		// 确保小数点不在开头
		value = value.replace(/^\./g, '');

		// 限制小数点后最多两位数字
		value = value.replace(/(\.\d{2})\d+/g, '$1');

		// 更新输入值

		setTimeout(() => {
			amount.value = value;
		}, 1);
	}

	// 人民币转大写的核心函数
	const convert = () => {
		// 验证输入
		if (!amount.value) {
			result.value = '请输入金额';
			return;
		}

		// 处理输入，确保最多两位小数
		const num = parseFloat(amount.value);
		if (isNaN(num) || num < 0) {
			result.value = '请输入有效的非负金额';
			return;
		}

		// 转换为两位小数的字符串表示
		const numStr = num.toFixed(2);

		// 执行转换
		result.value = rmbToUppercase(numStr);
	};

	// 全新编写的转换函数，逐位处理确保零的正确添加
	const rmbToUppercase = (numStr) => {
		const digits = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
		const units = ['', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿'];
		const decUnits = ['角', '分'];

		const [intPart, decPart] = numStr.split('.');
		let parts = []; // 用数组存储各部分，最后拼接，避免字符串处理错误
		let hasNonZero = false;
		let pendingZero = false; // 标记是否需要在下一个非零数字前加零

		// 处理整数部分（从高位到低位）
		for (let i = 0; i < intPart.length; i++) {
			const digit = parseInt(intPart[i]);
			const position = intPart.length - i - 1; // 当前位的单位位置

			if (digit !== 0) {
				hasNonZero = true;

				// 如果之前有零未处理，先添加零
				if (pendingZero) {
					parts.push('零');
					pendingZero = false;
				}

				// 添加数字和单位
				parts.push(digits[digit] + units[position]);
			} else if (hasNonZero) {
				// 当前是零且前面已有非零数字
				const nextDigit = i + 1 < intPart.length ? parseInt(intPart[i + 1]) : 0;
				const isUnitPosition = units[position] === '万' || units[position] === '亿';

				// 单位位（万、亿）即使是零也需要保留单位
				if (isUnitPosition) {
					// 检查是否已经有该单位，避免重复添加
					if (!parts[parts.length - 1]?.endsWith(units[position])) {
						parts.push(units[position]);
					}
					pendingZero = false; // 单位后重置零标记
				}
				// 下一位有非零数字时，标记需要添加零
				else if (nextDigit !== 0) {
					pendingZero = true;
				}
			}
		}

		// 处理整数部分全为零的情况
		if (!hasNonZero) {
			parts.push('零');
		}

		// 添加"元"单位
		parts.push('元');

		// 处理小数部分
		const hasJiao = decPart[0] !== '0';
		const hasFen = decPart[1] !== '0';

		if (hasJiao || hasFen) {
			// 角位为零且分位有值时，加零
			if (!hasJiao && hasFen) {
				parts.push('零');
			}

			if (hasJiao) {
				parts.push(digits[parseInt(decPart[0])] + decUnits[0]);
			}

			if (hasFen) {
				parts.push(digits[parseInt(decPart[1])] + decUnits[1]);
			}
		} else {
			// 无角分则加"整"
			parts.push('整');
		}

		return parts.join('');
	}
</script>

<style>
	@import "RMB.css"
</style>